理解Binder系列:开篇

综述

如果要对Android系统进行深入的了解,而不仅仅停留在对Framework层的理解,那么Binder是必须跨越的一部分内容,笔者认为,Android的消息事件机(Handler)和Binder是Android整个系统的骨骼架构,所有的血肉都依存这个骨骼架构建立起了庞大的Android系统,虽然从Linux的角度来讲,Android可能仅仅只是位于其上层的一个大型软件系统,但Binder的内容可以说是和Linux系统结合最为紧密的部分,它属于Linux Kernel层,实现了一套完整的进程通讯机制,而Android系统依赖于该机制提供各种服务。

基于Binder的分析,很多文章都会从kernel层,runtime层,framework层来进行分析,但往往一介绍就牵一发而动全身,各层相互交织,各种抽象的类,方法都需要了解透彻才能弄懂Binder的设计精髓。为了方便读者更好更快的理解Binder子系统,我打算采用自顶向下的方式结合具体的场景功能来解释Binder在其中是如何发挥作用的,而不仅仅是贴出相关的源码做简要的描述。另外,由于要理解kernel层binder部分的内容,要对linux系统和驱动部分有深刻的理解,而且这部分内容比较晦涩难以理解,所以kernel层的具体实现和细节我会单独进行分析,而对于它的上层,我们只需要知道Binder在kernel层提供了哪些功能以及如何这些提供给上层使用即可。

什么是Binder

Binder顾名思义粘合剂,它的目的在于粘合住不同的进程,使之实现通信。准确的来说,Binder将粘接的进程分成了Server进程和Client进程。Client进程通过Binder来使用Server进程提供的服务,从而完成一系列的工作。这便是Binder存在的原因。

为什么是Binder

进程间的通信方式多种多样,常见的有共享内存,Socket,管道,消息队列,信号量等等,但Android为什么要另起炉灶开发出Binder作为IPC通信的方式,主要是因为以下几个原因:

  1. 从性能上来讲,Binder的效率比较好,一次完整的通信只需要一次数据拷贝
  2. 从架构上来讲,Binder采用的是C/S架构,结构比较简单和明确。
  3. 从安全性能上来讲,Binder在Server进程会根据权限策略进行控制访问。

Binder的架构

前面我们说过Binder是C/S架构,Client进程要访问Server端的进程来提供服务,Server进程一般在系统只存在一个,多个Client进程可以通过Server进程的句柄来和其进行通信,这个句柄是由Binder提供的,通过它可以和Server进程进行通信,这个也是由Binder保证的。

Android系统在此基础了上为了方便使用Binder机制,分别针对Framework层和Native层做了封装。

  1. Java framework:Server端继承于Binder类,Client端继承于BinderProxy类。
  2. Native Framework层:Server端继承于BBinder类,Client端继承于BpBinder。

为什么会针对不同层做不同的封装?实际上是由于Binder Server不仅在Native层存在(如SufaceFlinger,CameraService等),同时在Framework层有有Binder Server(如ActivityManagerService,WindowManagerService等)为了方便各层能够更好的使用Binder机制,所以在每一层都对Binder进行了封装以方便使用。

但无论是Framework还是Native层的Binder Server,它们最终都要被Client端使用,因此必须有一个能够管理这些Server的大管家,它就是ServiceManager,而为了方便管理Server进程,Android系统提供了ServiceManager这个服务大管家,所有的实名Binder Server都需要在ServiceManager中注册了才能被Client进程使用。Client进程使用实名的Server服务也需要到ServiceManager取获取其对应的句柄,随后通过这个句柄和Server进程进行通信。这就是Binder IPC最基本的操作。我们可以将Android 的Binder机制同DNS机制做一个类比,Client请求Server进程进行IPC调用的过程就像是浏览器请求DNS进行域名解析的过程,在这个过程中,Client就是浏览器负责发起请求,ServiceManager就如DNS域名服务器,Server就像我们要访问的服务器,而Binder呢就是我们进行通信的路由器,浏览器请求访问服务器的过程需要知道服务器的Ip地址,有了这个IP地址才能够和服务器建立链接,然后进行通信,同样,Client同样需要从ServerManager得到Server进程的句柄,有了这个句柄,就可以通过它和Server进行进行通信了。

提纲

接下来,我们将分别从以下几个方面介绍Binder

  1. 理解Binder系列:服务管家ServiceManager
  2. 理解Binder系列:通信载体Parcel
  3. 理解Binder系列:Native层Binder的IPC过程
  4. 理解Binder系列:Java层Binder的IPC过程
  5. 理解Binder系列:Binder卟告原理及作用
  6. 理解Binder系列:匿名Binder
  7. 理解Binder系列:Binder的数据流过程
  8. 理解Binder系列:Binder的权限控制

在介绍完Binder的基本原理后,接下来会分析一些Binder应用的具体的场景

  1. 理解Binder系列:关于应用进程的Binder初始化
  2. 理解Binder系列:AIDL与Binder机制
  3. 理解Binder系列:自定义Binder服务

最后当我们对Binder有了具体的认识后,再回过头去深究Binder最为核心的机制,即Binder在driver中的实现内容,这部分的内容是最为晦涩难懂的部分,需要读者有一定的linux相关知识。

  1. 理解Binder系列:Binder驱动协议
  2. 理解Binder系列:Binder驱动工作机制
坚持原创技术分享,您的支持将鼓励我继续创作!